home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / tvx.arc / TVX-IBM.C < prev    next >
Text File  |  1989-07-30  |  8KB  |  302 lines

  1. /* ------------------------------- tvx_ibm.c ------------------------ */
  2. #define FALSE 0
  3. #define TRUE 1
  4. /*    Interface to IBM ROM BIOS INT10 screen control.  Following
  5.     control codes are defined:
  6.  
  7.     ^@,0    ^A,1    ^B,2    ^C,3
  8.     other, erslin, erseos, inslin
  9.     ^D,4    ^E,5    ^F,6    ^G,7
  10.     undlon, undloff, dellin, bell
  11.     ^H,8    ^I,9    ^J,10    ^K,11
  12.     backsp,    tab, linefeed, boldon
  13.     ^L,12    ^M,13    ^N,14    ^O,15
  14.     boldoff, enter, reversoff, blinkoff
  15.     ^P,16    ^Q,17    ^R,18    ^S,19, ^T,20
  16.     reverson, blinkon, setxy, cursor1, initcursor
  17.  */
  18. #define m_normal 07    /* white on black */
  19. #define m_underline 01    /* normal, underlined */
  20. #define m_reverse 0x70
  21. #define m_dim 0xF7    /* dim display */
  22. #define m_bright 0x08    /* bright display */
  23. #define m_blink    0x80    /* blink for errors */
  24. #define m_noblink 0x7F
  25.  
  26.  
  27. /* ============================ dispch ============================== */
  28.   dispch(chin)
  29.   int chin;
  30.   {
  31.  
  32.     static int ch;
  33.     struct regval
  34.       {
  35.     unsigned int ax;
  36.     unsigned int bx;
  37.     unsigned int cx;
  38.     unsigned int dx;
  39.     unsigned int si;
  40.     unsigned int di;
  41.     unsigned int ds;
  42.     unsigned int es;
  43.       };
  44.     struct regval rin, rout;
  45.  
  46.     /* data structures for screen control */
  47.     static int ich;
  48.     static int maxcol = 79;        /*  max col, counting from 0 */
  49.     static int savechar;
  50.     static int initflg = FALSE;
  51.     static int curpage = 0;        /* current display page (internal) */
  52.     static int curmode = 7;        /* white on black */
  53.     static int curcol;            /* col and row, preserve this order */
  54.     static int currow;            /* so can load in one instruction */
  55.     static int curstate = 0;        /* 0: accepting chars
  56.                        1: waiting for row
  57.                        2: waiting for col */
  58.     static int rowpend = 0;        /* to save pending row */
  59.     static int initcursor;        /* initial cursor */
  60.     static int altcursor;
  61.     static int color;        /* mono or color */
  62.  
  63.     ch = chin & 0xff;
  64.  
  65.     if (!initflg)
  66.       {
  67.     rin.ax = 0x0F00;        /* ah is 15, get video state */
  68.     sysint(0x10, &rin, &rout);    /* int 10h */
  69.     maxcol = ((rout.ax >> 8) & 0xff) - 1;    /* make relative value (0-79) */
  70.       curpage = (rout.bx >> 8) & 0xff;    /* the active page */
  71.     rin.ax = 0x0300;        /* read cursor position */
  72.     sysint(0x10, &rin, &rout);    /* int 10h */
  73.     curcol = rout.dx & 0xff;    /* low order is col */
  74.     currow = (rout.dx >> 8) & 0xff;
  75.     sysint(0x11,&rin,&rout);    /* get system configuration */
  76.     color = (rout.ax & 0x30) != 0x30;
  77.     if (!color)
  78.       {
  79.         initcursor = 0x0c0d;    /* 12, 13 - avoids PC ROM bug! */
  80.         altcursor = 0x060d;        /* 6,13 for insert */
  81.       }
  82.     else
  83.       {
  84.         initcursor = 0x0607;    /* current cursor mode, color */
  85.         altcursor = 0x0307;        /* half block */
  86.       }
  87.     initflg = TRUE;
  88.       }
  89.  
  90.  
  91.     if (curstate != 0)        /* waiting for row or col? */
  92.       {
  93.     if (curstate == 1)
  94.       {
  95.         /* in state 1, so this is row */
  96.         rowpend = ch;        /* save pending row */
  97.         curstate = 2;        /* now in wait state */
  98.         return;
  99.       }
  100.     else        /* waiting for column */
  101.       {
  102.         ich = ch - ' ';    /* convert to absolute */
  103.         if (ich > maxcol)
  104.         ich = maxcol;
  105.         curcol = ich;    /* remember column */
  106.         rowpend -= ' ';    /* convert row */
  107.         if (rowpend > 24)
  108.         rowpend = 24;
  109.         currow = rowpend;
  110.         rin.dx = (currow << 8) | curcol;
  111.         rin.bx = curpage << 8;
  112.         rin.ax = 0x200;    /* 2 => set cursor */
  113.         sysint(0x10, &rin, &rout);    /* int 10h */
  114.         curstate = 0;
  115.         return;
  116.       }
  117.       }
  118.     else
  119.       {
  120.     if (ch >= ' ')
  121.         goto SHOWCHAR;    /* slight optimization */
  122.  
  123.     switch (ch)
  124.       {
  125.         case 1:        /* erase from cursor to end of line */
  126. erslin:
  127.         rin.cx = rin.dx = currow << 8;        /* set row */
  128.         rin.cx |= curcol;        /* set col */
  129.         rin.dx |= maxcol;        /* blank to max col */
  130.         rin.ax = 0x600;          /* scroll active page up, blank section */
  131.         rin.bx = curmode << 8;
  132.         sysint(0x10, &rin, &rout);    /* int 10h */
  133.         return;
  134.  
  135.         case 2:        /* erase from cursor to end of screen */
  136.         /* first, earase current row */
  137.         rin.cx = rin.dx = currow << 8;        /* set row */
  138.         rin.cx |= curcol;        /* set col */
  139.         rin.dx |= maxcol;        /* blank to max col */
  140.         rin.ax = 0x600;          /* scroll active page up, blank section */
  141.         rin.bx = curmode << 8;
  142.         sysint(0x10, &rin, &rout);    /* int 10h */
  143.         if (currow >= 24)    /* on bottom row now? */
  144.             return;
  145.         rin.cx = (currow + 1) << 8;     /* next row, col 0 */
  146.         rin.dx = 0x1800 | maxcol;
  147.         rin.ax = 0x0600;        /* 6: scroll 0: blank */
  148.         sysint(0x10, &rin, &rout);    /* int 10h */
  149.         return;
  150.  
  151.         case 3:        /* insert a blank line at cursor */
  152.         if (currow < 24)
  153.           {
  154.             rin.cx = (currow << 8);
  155.             rin.dx = 0x1800 | maxcol;    /* define window to scroll */
  156.             rin.bx = curmode << 8;
  157.             rin.ax = 0x0701;        /* one line, scroll down */
  158.             sysint(0x10, &rin, &rout);    /* int 10h */
  159.           }
  160.         curcol = 0;        /* home to line beginning */
  161.         rin.dx = currow << 8;    /* dh = currow, dl = 0 */
  162.         rin.bx = curpage << 8;
  163.         rin.ax = 0x0200;    /* reset cursor position */
  164.         sysint(0x10, &rin, &rout);    /* int 10h */
  165.         if (currow >= 24)    /* special case */
  166.             goto erslin;
  167.         return;
  168.  
  169.         case 4:        /* underline on */
  170.         curmode = (curmode & 0x88) | m_underline;
  171.         return;
  172.  
  173.         case 5:        /* underline off */
  174.         curmode = (curmode & 0x88) | m_normal;
  175.         return;
  176.  
  177.         case 6:            /*  kill line cursor is on */
  178.         rin.cx = currow << 8;    /* define window to scroll */
  179.         rin.dx = 0x1800 | maxcol;
  180.         rin.ax = 0x0601;        /* one line (al), scroll up (6) */
  181.         rin.bx = curmode << 8;
  182.         sysint(0x10, &rin, &rout);    /* int 10h */
  183.         curcol = 0 ;        /* home to line beginning */
  184.         rin.dx = currow << 8;
  185.         rin.bx = curpage << 8;
  186.         rin.ax = 0x0200;
  187.         sysint(0x10, &rin, &rout);    /* int 10h */
  188.         return;
  189.  
  190.         case 7:        /* bell */
  191.         bdos(2,ch);
  192.         return;
  193.  
  194.         case 8:        /* backspace */
  195.         if (curcol <= 0)
  196.             return;
  197.         --curcol;
  198.         rin.bx = curpage << 8;
  199.         rin.dx = (currow << 8) | curcol;
  200.         rin.ax = 0x0200;    /* set cursor pos */
  201.         sysint(0x10, &rin, &rout);    /* int 10h */
  202.         return;
  203.  
  204.         case 9:        /* tab */
  205.         ch = ' ';
  206.         goto SHOWCHAR;
  207.  
  208.         case 10:        /* line feed, scroll if bottom */
  209.         if (currow < 24)
  210.           {
  211.             rin.dx = (++currow << 8) | curcol;
  212.             rin.bx = curpage << 8;
  213.             rin.ax = 0x0200;        /* set cursor */
  214.             sysint(0x10, &rin, &rout);    /* int 10h */
  215.           }
  216.         else
  217.           {
  218.             /* need to scroll up */
  219.             rin.ax = 0x0601;    /* scroll up (6) 1 line (1) */
  220.             rin.cx = 0;        /* upper right */
  221.             rin.dx = 0x1800 | maxcol;
  222.             rin.bx = curmode << 8;
  223.             sysint(0x10, &rin, &rout);    /* int 10h */
  224.           }
  225.         return;
  226.  
  227.         case 11:        /* bold on */
  228.         curmode |= m_bright;
  229.         return;
  230.  
  231.         case 12:        /* bold off */
  232.         curmode &= m_dim;
  233.         return;
  234.  
  235.         case 13:        /* CR, include erase end of line */
  236.         if (curcol >= maxcol)
  237.             goto NOBLANK;
  238.         rin.cx = rin.dx = currow << 8;        /* set row */
  239.         rin.cx |= curcol;        /* set col */
  240.         rin.dx |= maxcol;        /* blank to max col */
  241.         rin.ax = 0x0600;    /* scroll up, blank section */
  242.         rin.bx = curmode << 8;
  243.         sysint(0x10, &rin, &rout);    /* int 10h */
  244. NOBLANK:
  245.         curcol = 0;
  246.             rin.dx = (currow << 8);
  247.         rin.bx = curpage << 8;
  248.         rin.ax = 0x0200;
  249.         sysint(0x10, &rin, &rout);    /* int 10h */
  250.         return;
  251.  
  252.         case 14:        /* reverse off */
  253.         curmode = (curmode & 0x88) | m_normal ;
  254.         return;
  255.  
  256.         case 15:        /* blink off */
  257.         curmode &= m_noblink;
  258.         return;
  259.  
  260.         case 16:        /* reverse on */
  261.         curmode = (curmode & 0x88) | m_reverse;
  262.         return;
  263.  
  264.         case 17:        /* blink on */
  265.         curmode |= m_blink;
  266.         return;
  267.  
  268.         case 18:        /* set xy */
  269.         curstate = 1;
  270.         return;
  271.  
  272.         case 19:            /* change cursor */
  273.         rin.ax = 0x0100;    /* set cursor type */
  274.         rin.cx = altcursor;    /* half block */
  275.         sysint(0x10, &rin, &rout);
  276.         return;
  277.  
  278.         case 20:            /* change cursor */
  279.         rin.ax = 0x0100;    /* set cursor type */
  280.         rin.cx = initcursor;    /* original */
  281.         sysint(0x10, &rin, &rout);
  282.         return;
  283.  
  284.  
  285.         default:        /* show char */
  286. SHOWCHAR:
  287.         if (curcol > maxcol)    /* update column */
  288.             return;
  289.         rin.ax = 0x0900 | ch;        /* display char */
  290.         rin.bx = (curpage << 8) | curmode;
  291.         rin.cx = 1;
  292.         sysint(0x10, &rin, &rout);    /* int 10h */
  293.         ++curcol;
  294.         rin.dx = (currow << 8) | curcol;
  295.         rin.ax = 0x0200;
  296.         sysint(0x10, &rin, &rout);    /* int 10h */
  297.         return;
  298.       }    /* end of switch */
  299.       }        /* end of else */
  300.   }
  301. /* ------------------------------- tvx_ibm.c ------------------------ */
  302.